From: Sebastian Wick Date: Wed, 2 Jul 2025 10:23:51 +0000 (+0200) Subject: osdWindow: Take per-monitor information in show and add showAll, showOne X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~116^2^2~8 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=58e9923478b91b8c8b6b99dba5f8b9566919c9eb;p=gnome-shell.git osdWindow: Take per-monitor information in show and add showAll, showOne The current API only supports showing an OSD on all monitors or on one monitor. This change makes it possible to show the OSD on any combination of monitors while providing simpler functions for the common usages. It still retains the single-event character and cancels previous OSDs on unaffected monitors. We will require this for the screen brightness keyboard shortcuts in the future. Part-of: --- diff --git a/js/ui/osdWindow.js b/js/ui/osdWindow.js index 818595f98..24590d542 100644 --- a/js/ui/osdWindow.js +++ b/js/ui/osdWindow.js @@ -171,20 +171,28 @@ export class OsdWindowManager { this._osdWindows[monitorIndex].show(); } - show(monitorIndex, icon, label, level, maxLevel) { - if (monitorIndex !== -1) { - for (let i = 0; i < this._osdWindows.length; i++) { - if (i === monitorIndex) - this._showOsdWindow(i, icon, label, level, maxLevel); - else - this._osdWindows[i].cancel(); - } - } else { - for (let i = 0; i < this._osdWindows.length; i++) + show(icon, label, levels) { + for (let i = 0; i < this._osdWindows.length; i++) { + if (levels[i]) { + const {level, maxLevel = -1} = levels[i]; this._showOsdWindow(i, icon, label, level, maxLevel); + } else { + this._osdWindows[i].cancel(); + } } } + showOne(monitorIndex, icon, label, level, maxLevel) { + this.show(icon, label, { + [monitorIndex]: {level, maxLevel}, + }); + } + + showAll(icon, label, level, maxLevel) { + for (let i = 0; i < this._osdWindows.length; i++) + this._showOsdWindow(i, icon, label, level, maxLevel); + } + hideAll() { for (let i = 0; i < this._osdWindows.length; i++) this._osdWindows[i].cancel(); diff --git a/js/ui/shellDBus.js b/js/ui/shellDBus.js index bbddefb3d..0e2cf2b59 100644 --- a/js/ui/shellDBus.js +++ b/js/ui/shellDBus.js @@ -135,17 +135,18 @@ export class GnomeShell { icon: serializedIcon, } = params; - let monitorIndex = -1; - if (connector) { - const monitorManager = global.backend.get_monitor_manager(); - monitorIndex = monitorManager.get_monitor_for_connector(connector); - } - let icon = null; if (serializedIcon) icon = Gio.Icon.new_for_string(serializedIcon); - Main.osdWindowManager.show(monitorIndex, icon, label, level, maxLevel); + if (connector) { + const monitorManager = global.backend.get_monitor_manager(); + const monitorIndex = + monitorManager.get_monitor_for_connector(connector); + Main.osdWindowManager.showOne(monitorIndex, icon, label, level, maxLevel); + } else { + Main.osdWindowManager.showAll(icon, label, level, maxLevel); + } invocation.return_value(null); } diff --git a/js/ui/status/volume.js b/js/ui/status/volume.js index e2fa9a207..89d3bebec 100644 --- a/js/ui/status/volume.js +++ b/js/ui/status/volume.js @@ -281,7 +281,7 @@ const StreamSlider = GObject.registerClass({ const gicon = new Gio.ThemedIcon({name: this.getIcon()}); const level = this.getLevel(); const maxLevel = this.getMaxLevel(); - Main.osdWindowManager.show(-1, gicon, null, level, maxLevel); + Main.osdWindowManager.showAll(gicon, null, level, maxLevel); } }); diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js index c05a52ea1..e48e6d3fc 100644 --- a/js/ui/windowManager.js +++ b/js/ui/windowManager.js @@ -887,7 +887,7 @@ export class WindowManager { global.display.connect('show-pad-osd', this._showPadOsd.bind(this)); global.display.connect('show-osd', (display, monitorIndex, iconName, label) => { let icon = Gio.Icon.new_for_string(iconName); - Main.osdWindowManager.show(monitorIndex, icon, label, null); + Main.osdWindowManager.showOne(monitorIndex, icon, label); }); global.display.connect('init-xserver', (display, task) => {